{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 位置编码与自注意力机制"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "from torch import nn\n",
    "from torch import optim\n",
    "from torch.nn import functional as F\n",
    "from torch.utils.data import TensorDataset\n",
    "from torch.utils.data import DataLoader\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import math\n",
    "from torch.autograd import Variable\n",
    "import copy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 位置编码\n",
    "\n",
    "以前的方法-表格型\n",
    "\n",
    "* 方法一：使用[0,1]范围分配\n",
    "\n",
    "这个方法的分配方式是，将0-1这个范围的，将第一个token分配0，最后一个token分配去1，其余的token按照文章的长度平均分配。具体形式如下：\n",
    "\n",
    "我喜欢吃洋葱 【0 0.16 0.32.....1】\n",
    "\n",
    "我真的不喜欢吃洋葱【0 0.125 0.25.....1】\n",
    "\n",
    "问题：我们可以看到，如果句子长度不同，那么位置编码是不一样，所以无法表示句子之间有什么相似性。\n",
    "\n",
    "* 方法二：1-n正整数范围分配\n",
    "\n",
    "这个方法比较直观，就是按照输入的顺序，一次分配给token所在的索引位置。具体形式如下：\n",
    "\n",
    "我喜欢吃洋葱 【1，2，3，4，5，6】\n",
    "\n",
    "我真的不喜欢吃洋葱【1，2，3，4，5，6，7】\n",
    "\n",
    "问题：往往句子越长，后面的值越大，数字越大说明这个位置占的权重也越大，这样的方式无法凸显每个位置的真实的权重。\n",
    "\n",
    "https://erdem.pl/2021/05/understanding-positional-encoding-in-transformers\n",
    "\n",
    "https://www.cnblogs.com/yanshw/p/16740972.html\n",
    "\n",
    "https://www.cnblogs.com/ghj1976/p/li-jietransformer-de-wei-zhi-bian-ma.html\n",
    "\n",
    "https://blog.csdn.net/Kaiyuan_sjtu/article/details/119621613"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<img src=\"31.jpg\" width=\"800\"/>"
      ],
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Image(url= \"31.jpg\",width=800)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<img src=\"32.jpg\" width=\"800\"/>"
      ],
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Image(url= \"32.jpg\",width=800)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Transformer算法中的位置编码与其他方法的比较（chatgpt）\n",
    "\n",
    "Transformer算法中的位置编码(Positional Encoding)与RNN、LSTM处理顺序信息的方法具有以下优缺点:\n",
    "\n",
    "**位置编码的优点:**\n",
    "\n",
    "- 计算效率高,可以完全并行\n",
    "- 为模型带来一定位置不变性,对小的位置变化更鲁棒\n",
    "- 使用周期函数,使模型更好地学习位置信息\n",
    "- 避免位置信息过于绝对化\n",
    "- 较RNN和LSTM更简单,只编码位置信息\n",
    "\n",
    "**位置编码的缺点:**\n",
    "\n",
    "- 需要设置最大序列长度,长度过长会导致计算复杂度提升\n",
    "- 仅编码相对位置,无法表示绝对位置\n",
    "- 对语序变化不如RNN等顺序敏感\n",
    "- 需搭配注意力机制,单独使用效果较弱\n",
    "\n",
    "**RNN和LSTM的优点:** \n",
    "\n",
    "- 可以表示绝对位置信息\n",
    "- 对语序变化更敏感\n",
    "- LSTM可以捕捉长程依赖关系\n",
    "\n",
    "**RNN和LSTM的缺点:**\n",
    "\n",
    "- 计算复杂度高,无法并行计算\n",
    "- 对位置信息过于敏感\n",
    "- 隐状态编码了所有历史,计算资源利用率低\n",
    "\n",
    "总之,位置编码更高效并具有一定位置鲁棒性,但RNN和LSTM可以建模绝对位置并对语序更敏感。两者互补的特点可根据任务需求进行选择。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 位置编码公式的难点，浅显易懂的方式\n",
    "\n",
    "2. 传统编码的优缺点\n",
    "\n",
    "3. 改良的问题\n",
    "\n",
    "4. 我的改良方案，优点缺点\n",
    "\n",
    "5. 进一步改良。\n",
    "\n",
    "6. 最后方案的精髓：取值范围，周期性，周期性随维度变化\n",
    "\n",
    "7. 神经网络构建的特性与正余弦方案的逻辑\n",
    "\n",
    "8. 具体代码实施\n",
    "\n",
    "9. 位置编码的应用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "1,2,3,4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "def weizhi_yn(x,y,n):\n",
    "    return [(x//(y**i))%y for i in range(n)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1, 9, 9, 9]"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "weizhi_yn(119991,10,4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 神经网络"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 周期性\n",
    "2. 周期性随着维度的增长而增长（频率随着维度的增长而降低）\n",
    "3. 取值范围是有限，最好是-1~1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2345\n"
     ]
    }
   ],
   "source": [
    "a=0\n",
    "for i,j in enumerate(weizhi_yn(2345,5,7)):\n",
    "    a=a+j*(5**i)\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "x=list(range(300))\n",
    "y0=[(i//(10**0))%10 for i in x]\n",
    "y1=[(i//(10**1))%10 for i in x]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x2175ae842b0>]"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10,3))\n",
    "plt.plot(x,y0)\n",
    "plt.plot(x,y1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x2059760fd90>]"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x300 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10,3))\n",
    "plt.plot(x,y1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "#np.zeros(shape=(60,4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "-0.5440211108893698\n",
      "-0.8390715290764524\n",
      "1\n",
      "0.4476708347189573\n",
      "0.8941984252625543\n",
      "2\n",
      "0.02154268027233166\n",
      "0.9997679295349917\n"
     ]
    }
   ],
   "source": [
    "pos=10\n",
    "dim=6\n",
    "n=10000\n",
    "for i in range(int(dim/2)):\n",
    "    print(i)\n",
    "    denominator = np.power(n, 2*i/dim)\n",
    "    print(np.sin(pos/denominator))\n",
    "    print(np.cos(pos/denominator))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.00000000e+00,  1.00000000e+00,  0.00000000e+00, ...,\n",
       "         1.00000000e+00,  0.00000000e+00,  1.00000000e+00],\n",
       "       [ 8.41470985e-01,  5.40302306e-01,  7.61720408e-01, ...,\n",
       "         9.99999991e-01,  1.15478198e-04,  9.99999993e-01],\n",
       "       [ 9.09297427e-01, -4.16146837e-01,  9.87046251e-01, ...,\n",
       "         9.99999964e-01,  2.30956395e-04,  9.99999973e-01],\n",
       "       ...,\n",
       "       [ 1.23573123e-01, -9.92335469e-01,  1.39920673e-01, ...,\n",
       "         9.99980359e-01,  5.42744868e-03,  9.99985271e-01],\n",
       "       [-7.68254661e-01, -6.40144339e-01, -6.63571724e-01, ...,\n",
       "         9.99979514e-01,  5.54292514e-03,  9.99984638e-01],\n",
       "       [-9.53752653e-01,  3.00592544e-01, -9.99784705e-01, ...,\n",
       "         9.99978652e-01,  5.65840153e-03,  9.99983991e-01]])"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "PE"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.00000000e+00  1.00000000e+00  0.00000000e+00 ...  1.00000000e+00\n",
      "   0.00000000e+00  1.00000000e+00]\n",
      " [ 8.41470985e-01  5.40302306e-01  7.61720408e-01 ...  9.99999991e-01\n",
      "   1.15478198e-04  9.99999993e-01]\n",
      " [ 9.09297427e-01 -4.16146837e-01  9.87046251e-01 ...  9.99999964e-01\n",
      "   2.30956395e-04  9.99999973e-01]\n",
      " ...\n",
      " [ 1.23573123e-01 -9.92335469e-01  1.39920673e-01 ...  9.99980359e-01\n",
      "   5.42744868e-03  9.99985271e-01]\n",
      " [-7.68254661e-01 -6.40144339e-01 -6.63571724e-01 ...  9.99979514e-01\n",
      "   5.54292514e-03  9.99984638e-01]\n",
      " [-9.53752653e-01  3.00592544e-01 -9.99784705e-01 ...  9.99978652e-01\n",
      "   5.65840153e-03  9.99983991e-01]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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9atftY9pbW21cnJyrEcfffRYTRMRamhosEpLS61Vq1ZZZ511lnXLLbdYlsVx7ehuv/1262tf+5rx6xzfjuvCCy+0vv/974dkl112mfWd73zHsiyObUclItayZcva/z+S41hbW2ulpKRYixcvbh+za9cuy+l0WitXrjxqc8eRffnYat5++21LRKzPP//csiyObSLV1dVZImK992GeVVFZENPtvQ/zLBGx6urqjvXDOqqS8synz+eTDRs2SFlZWUheVlYma9asOUazQjzU1dWJiEhubq6IiFRUVEh1dXXIsfZ4PHLWWWdxrDuAG2+8US688EI555xzQnKOa8e2fPlyGTVqlHzrW9+SvLw8GT58uPz+979v/zrHt+P62te+Ji+//LJ8/PHHIiLy7rvvyptvvikXXHCBiHBsO4tIjuOGDRvE7/eHjCkqKpKhQ4dyrDuYuro6cTgc7VencGyRzJKy7Xbfvn0SCAQkPz8/JM/Pz5fq6upjNCvEyrIsmTVrlnzta1+ToUOHioi0H0/tWH/++edHfY6I3OLFi2Xjxo2yfv36sK9xXDu2zz77TB555BGZNWuW/PSnP5W3335bbr75ZvF4PPLd736X49uB3X777VJXVyeDBg0Sl8slgUBAfvnLX8q3v/1tEeFnt7OI5DhWV1dLamqq9OjRI2wM/9bqOFpbW+UnP/mJXH311ZKdnS0iHNujIR7v2eyq7/lMysXnYQ6HI+T/LcsKy9Bx3HTTTfLee+/Jm2++GfY1jnXHUllZKbfccou8+OKLkpaWZhzHce2YgsGgjBo1SubMmSMiIsOHD5ctW7bII488It/97nfbx3F8O54lS5bIU089Jc8884wMGTJENm/eLDNnzpSioiK59tpr28dxbDuHaI4jx7rj8Pv9ctVVV0kwGJSHH374K8dzbOMnKA4JSGz7Mhjj93dUSXnZba9evcTlcoW9OlNTUxP2Kh46hh/+8IeyfPlyefXVV6V3797teUFBgYgIx7qD2bBhg9TU1MjIkSPF7XaL2+2W1atXywMPPCBut7v92HFcO6bCwkI56aSTQrLBgwe3F77xc9tx/fd//7f85Cc/kauuukpOPvlkmTJlivzoRz+SuXPnigjHtrOI5DgWFBSIz+eTgwcPGscgefn9frnyyiuloqJCVq1a1X7WU4Rji+SWlIvP1NRUGTlypKxatSokX7Vq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",
      "text/plain": [
       "<Figure size 1228.8x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def getPositionEncoding(seq_len,dim,n=10000):\n",
    "  PE = np.zeros(shape=(seq_len,dim))\n",
    "  for pos in range(seq_len):\n",
    "    for i in range(int(dim/2)):\n",
    "      denominator = np.power(n, 2*i/dim)\n",
    "      PE[pos,2*i] = np.sin(pos/denominator)\n",
    "      PE[pos,2*i+1] = np.cos(pos/denominator)\n",
    "\n",
    "  return PE\n",
    "\n",
    "PE = getPositionEncoding(seq_len=50, dim=128, n=10000)\n",
    "print(PE)\n",
    "\n",
    "caxes = plt.matshow(PE,interpolation ='nearest')\n",
    "plt.colorbar(caxes) \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## transformer 中的位置编码的使用\n",
    "\n",
    "https://blog.csdn.net/qq_52785473/article/details/124537101\n",
    "\n",
    "* register_buffer(self, name, tensor)是一个PyTorch中的方法，它的作用是向模块（module）中添加一个持久的缓冲区（buffer）缓冲区是一种不被视为模型参数（model parameter）的张量（tensor），它不会在训练过程中更新梯度（gradient），但是会作为模块的状态（state）被保存和迁移"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### classwork1\n",
    "\n",
    "* 已知如下类，通过给定的x运行下面的词嵌入类和位置编码类，并打印结果张量及其维度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#词嵌入\n",
    "class Embeddings(nn.Module):\n",
    "    def __init__(self, d_model, vocab):\n",
    "    # d_model:词嵌入维度\n",
    "    # vocab:字典大小\n",
    "        super(Embeddings, self).__init__()\n",
    "        self.lut = nn.Embedding(vocab, d_model)\n",
    "        self.d_model = d_model\n",
    "    def forward(self, x):\n",
    "        return self.lut(x) * math.sqrt(self.d_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([2, 4, 10])\n"
     ]
    }
   ],
   "source": [
    "d_model = 10  # embedding_size\n",
    "vocab = 1000  # 词典大小\n",
    "x=torch.tensor([[100, 2, 421, 508], [491, 998, 1, 221]], dtype=torch.long)\n",
    "emb = Embeddings(d_model, vocab)\n",
    "embr = emb(x)\n",
    "print(embr.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[ 1.6527, -4.2898, -7.0676, -0.2879,  0.4503,  1.6593, -2.8290,\n",
       "           1.3239, -1.3528, -4.3423],\n",
       "         [-4.9873, -3.2457,  0.4685,  4.4773, -1.5115,  1.9148,  5.6802,\n",
       "           0.6057, -1.2208,  6.1044],\n",
       "         [-4.9777, -0.6284,  3.7511, -2.1237, -2.1275, -2.0945,  1.9090,\n",
       "          -0.8950, -1.1659,  3.0948],\n",
       "         [ 1.4378, -0.2923,  3.4058, -3.2347, -0.0213, -0.3064,  4.0613,\n",
       "          -1.1672,  1.3529,  4.8704]],\n",
       "\n",
       "        [[-2.6389,  2.8365,  0.8154, -0.3518, -6.1504,  1.6444, -5.8082,\n",
       "          -2.5264,  1.7637,  4.9342],\n",
       "         [-3.8343, -0.5000,  2.1118, -3.0764, -0.7894, -4.6728,  9.5358,\n",
       "          -1.1405,  1.7375,  2.8379],\n",
       "         [-5.8903, -1.5858,  2.1292, -3.7824, -5.0227,  6.0156, -4.5564,\n",
       "           0.9712, -1.4247,  2.6252],\n",
       "         [-4.0722, -5.1162, -0.9665, -2.3756,  0.1784,  1.8918,  2.3819,\n",
       "           2.1925, -3.7461, -0.3825]]], grad_fn=<MulBackward0>)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "embr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "#位置编码\n",
    "class PositionalEncoding(nn.Module):\n",
    "    def __init__(self, d_model, dropout, max_len=5000):\n",
    "    # d_model:词嵌入维度\n",
    "    # dropout:置零比率\n",
    "    # max_len:每个句子最大的长度\n",
    "        super(PositionalEncoding, self).__init__()\n",
    "        self.dropout = nn.Dropout(p=dropout)\n",
    "        pe = torch.zeros(max_len, d_model)\n",
    "        position = torch.arange(0,  max_len).unsqueeze(1)\n",
    "        div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(1000.0) / d_model))\n",
    "        pe[:, 0::2] = torch.sin(position * div_term)\n",
    "        pe[:, 1::2] = torch.cos(position * div_term)\n",
    "        pe = pe.unsqueeze(0)\n",
    "        self.register_buffer(\"pe\", pe)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = x + self.pe[:, :x.size(1)]\n",
    "        return self.dropout(x)\n",
    "        #return x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([2, 4, 10])\n"
     ]
    }
   ],
   "source": [
    "dropout = 0.1\n",
    "max_len = 60\n",
    "pe = PositionalEncoding(d_model, dropout, max_len)\n",
    "pe_result = pe(embr)\n",
    "print(pe_result.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 注意力机制的思想与原理\n",
    "\n",
    "文字，全流程详细讲解，无代码 https://blog.csdn.net/benzhujie1245com/article/details/117173090\n",
    "\n",
    "视频，原因讲解 https://www.bilibili.com/video/BV1dt4y1J7ov/\n",
    "\n",
    "视频，讲解详细 https://www.bilibili.com/video/BV1v3411r78R/\n",
    "\n",
    "文字，简单讲解，有代码 https://blog.csdn.net/qq_52785473/article/details/124537101\n",
    "\n",
    "文字，简单讲解，有代码 https://blog.csdn.net/Datawhale/article/details/120320116\n",
    "\n",
    "https://wmathor.com/index.php/archives/1438/\n",
    "\n",
    "内积的几何意义\n",
    "\n",
    "https://cloud.tencent.com/developer/article/2157496\n",
    "\n",
    "\n",
    "https://zhuanlan.zhihu.com/p/631398525\n",
    "\n",
    "注意力机制（Attention Mechanism）是机器学习，尤其是深度学习领域中的一种技术，它模仿了人类视觉或听觉系统中的注意力选择能力。在处理信息时，人类不会对所有部分给予同等关注，而是有选择地聚焦于某些特定的部分。这种机制允许模型在处理序列数据时，比如翻译任务中的源语言句子到目标语言句子的转换，能够“关注”到输入序列的不同部分。\n",
    "\n",
    "### 注意力机制的起源\n",
    "\n",
    "注意力机制的概念最早可以追溯到20世纪90年代的人工神经网络研究，但直到2014年，Bahdanau等人在其论文《Neural Machine Translation by Jointly Learning to Align and Translate》中首次将注意力机制成功应用于神经机器翻译（NMT），才使得这一概念在深度学习领域得到了广泛的关注和发展。这篇论文提出了一种模型，该模型不仅能够学习如何翻译，还能学习如何对齐源语言和目标语言中的词语，即通过一个软对齐的方式确定哪些源语言词对于生成某个目标语言词更重要。\n",
    "\n",
    "### 注意力机制的基本公式\n",
    "\n",
    "注意力机制的核心在于计算一个权重分布，这个分布反映了在给定上下文的情况下，各个输入元素的重要性。基本的注意力机制可以分为以下几个步骤：\n",
    "\n",
    "1. **得分函数（Score Function）**：首先计算查询向量（query vector）与每个键向量（key vector）之间的相似度得分。常用的得分函数包括点积、加性（或称巴赫达努式，Bahdanau-style）、缩放点积等。例如，使用点积作为得分函数：\n",
    "   $$ e_{ij} = \\text{score}(\\mathbf{q}_i, \\mathbf{k}_j) = \\mathbf{q}_i^T\\mathbf{k}_j $$\n",
    "   其中，$\\mathbf{q}_i$ 是查询向量，$\\mathbf{k}_j$ 是第 $j$ 个键向量。\n",
    "\n",
    "2. **权重计算（Weight Calculation）**：将得分转化为概率分布，通常使用softmax函数来实现，这样可以确保所有权重的总和为1。\n",
    "   $$ \\alpha_{ij} = \\frac{\\exp(e_{ij})}{\\sum_{k=1}^{T}\\exp(e_{ik})} $$\n",
    "   其中，$T$ 是键向量的数量，$\\alpha_{ij}$ 表示第 $j$ 个键向量相对于查询向量 $i$ 的注意力权重。\n",
    "\n",
    "3. **加权求和（Weighted Sum）**：根据计算得到的权重，对值向量（value vector）进行加权求和，生成上下文向量（context vector）。\n",
    "   $$ \\mathbf{c}_i = \\sum_{j=1}^{T} \\alpha_{ij} \\mathbf{v}_j $$\n",
    "   其中，$\\mathbf{v}_j$ 是与键向量 $\\mathbf{k}_j$ 相对应的值向量，$\\mathbf{c}_i$ 是最终的上下文向量，用于后续的处理或决策。\n",
    "\n",
    "这些步骤构成了注意力机制的基础框架，但在实际应用中，根据不同的任务需求，可能会有所变化或扩展。例如，在自然语言处理任务中，查询、键和值向量通常是从文本序列中提取的特征表示；而在计算机视觉任务中，则可能是从图像中提取的特征图。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 线性运算的意义\n",
    "\n",
    "* 向量点乘向量\n",
    "\n",
    "点乘的一个重要几何意义是它可以表示一个向量在另一个向量上的投影长度。\n",
    "\n",
    "* 矩阵点乘自身转置\n",
    "\n",
    "当一个矩阵与自身的转置进行点乘（内积）运算时，我们实际上是在计算该矩阵的每个行向量与其自身或其它行向量的点积。这种操作通常用于计算矩阵的行向量之间的相似度或者构造协方差矩阵等。\n",
    "\n",
    "* 矩阵点乘自身的相似性系数矩阵\n",
    "\n",
    "当你用若干向量构成一个矩阵，并且考虑这些向量之间的相关性系数时，你实际上是在探索这些向量之间的线性关系。\n",
    "\n",
    "假设你有一个 $ m \\times n $ 的矩阵 $ A $，其中每一列代表一个向量，共有 $ n $ 个向量，每个向量有 $ m $ 个元素。为了计算这些向量之间的相关性系数，通常需要对这些向量进行标准化处理，使其均值为 0，标准差为 1。这样做的目的是消除量纲的影响，使得相关性系数能够更好地反映向量之间的线性关系。\n",
    "\n",
    "* 相关性系数矩阵\n",
    "\n",
    "1. **标准化**：首先，对矩阵 $ A $ 中的每个向量进行标准化处理，得到标准化后的矩阵 $ Z $。标准化的公式为：\n",
    "   $$\n",
    "   z_{ij} = \\frac{a_{ij} - \\bar{a}_j}{s_j}\n",
    "   $$\n",
    "   其中，$ \\bar{a}_j $ 是第 $ j $ 列的均值，$ s_j $ 是第 $ j $ 列的标准差。\n",
    "\n",
    "2. **计算相关性系数矩阵**：接下来，计算标准化后的矩阵 $ Z $ 的转置 $ Z^T $ 与 $ Z $ 的乘积，然后除以 $ m-1 $（样本数量减一），得到相关性系数矩阵 $ R $：\n",
    "   $$\n",
    "   R = \\frac{1}{m-1} Z^T Z\n",
    "   $$\n",
    "   其中，$ R $ 是一个 $ n \\times n $ 的矩阵，其元素 $ r_{ij} $ 表示第 $ i $ 列向量和第 $ j $ 列向量之间的相关性系数。\n",
    "\n",
    "3. 相关性系数点乘的意义\n",
    "\n",
    " **与向量点乘**：如果你有一个向量 $ v $（假设维度为 $ n $），你可以计算 $ Rv $ 或 $ v^TR $。这可以理解为将向量 $ v $ 在相关性系数矩阵 $ R $ 所定义的空间中进行变换。例如，$ Rv $ 的结果向量中的每个元素表示 $ v $ 与 $ A $ 中每个向量的相关性加权和。\n",
    "\n",
    " **与矩阵点乘**：如果你有一个矩阵 $ B $（假设维度为 $ n \\times p $），你可以计算 $ RB $ 或 $ BR $。这可以理解为将矩阵 $ B $ 中的每个向量在相关性系数矩阵 $ R $ 所定义的空间中进行变换。例如，$ RB $ 的结果矩阵中的每个列向量表示 $ B $ 中对应列向量与 $ A $ 中每个向量的相关性加权和。\n",
    "\n",
    "4. 应用场景\n",
    "\n",
    " **特征选择**：在机器学习中，相关性系数可以用于特征选择，帮助识别哪些特征之间存在高度相关性，从而避免模型中的多重共线性问题。\n",
    "\n",
    " **数据降维**：在主成分分析（PCA）中，相关性系数矩阵用于计算协方差矩阵，进而提取数据的主要成分。\n",
    " \n",
    " **聚类分析**：在聚类分析中，相关性系数可以用于度量不同样本之间的相似性，帮助构建聚类模型。\n",
    "\n",
    "总之，相关性系数矩阵及其点乘操作在数据分析和机器学习中有着广泛的应用，能够帮助我们更好地理解和处理多维数据。 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<img src=\"https://pic1.zhimg.com/v2-43d8ebce2c5a2cb511331014a05aa688_1440w.jpg\"/>"
      ],
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import Image\n",
    "Image(url= \"https://pic1.zhimg.com/v2-43d8ebce2c5a2cb511331014a05aa688_1440w.jpg\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<img src=\"33.png\"/>"
      ],
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import Image\n",
    "Image(url= \"33.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<img src=\"34.png\"/>"
      ],
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Image(url= \"34.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "自注意力（Self-Attention）机制是注意力机制的一种特殊形式，它允许模型在同一序列内进行信息交互，而不需要依赖于外部的上下文信息。自注意力机制在处理长距离依赖关系时表现尤为出色，因此在自然语言处理（NLP）领域得到了广泛应用，尤其是在Transformer模型中。最早的自注意力机制是由Vaswani等人在2017年的论文《Attention is All You Need》中提出的。\n",
    "\n",
    "### 自注意力的思想\n",
    "\n",
    "自注意力的核心思想是，让序列中的每个位置都能够关注到序列中的其他位置，从而捕获更丰富的上下文信息。这种机制使得模型能够在处理长序列时，有效地捕捉远距离的依赖关系，而不需要像传统的RNN或LSTM那样逐个处理序列元素。\n",
    "\n",
    "### 自注意力的工作原理\n",
    "\n",
    "自注意力机制的基本步骤如下：\n",
    "\n",
    "1. **输入表示**：假设我们有一个输入序列 $X = [x_1, x_2, \\ldots, x_n]$，其中每个 $x_i$ 是一个向量。\n",
    "\n",
    "2. **线性变换**：对输入序列中的每个向量进行线性变换，生成查询向量（Query）、键向量（Key）和值向量（Value）。这些变换通常通过矩阵乘法实现：\n",
    "   $$ Q = XW^Q, \\quad K = XW^K, \\quad V = XW^V $$\n",
    "   其中，$W^Q$, $W^K$, 和 $W^V$ 是可学习的权重矩阵。\n",
    "\n",
    "3. **计算注意力分数**：使用查询向量和键向量计算注意力分数。最常见的方法是缩放点积注意力（Scaled Dot-Product Attention）：\n",
    "   $$ \\text{Attention}(Q, K, V) = \\text{softmax}\\left(\\frac{QK^T}{\\sqrt{d_k}}\\right)V $$\n",
    "   其中，$d_k$ 是键向量的维度，用于缩放点积以防止梯度消失或爆炸。\n",
    "\n",
    "4. **加权求和**：将注意力分数与值向量相乘，并进行加权求和，得到最终的输出向量：\n",
    "   $$ \\text{Output} = \\text{Attention}(Q, K, V) $$\n",
    "\n",
    "### 详细公式\n",
    "\n",
    "假设输入序列 $X$ 的形状为 $(n, d)$，其中 $n$ 是序列长度，$d$ 是向量维度。经过线性变换后，查询向量 $Q$、键向量 $K$ 和值向量 $V$ 的形状均为 $(n, d_k)$。\n",
    "\n",
    "1. **线性变换**：\n",
    "   $$ Q = XW^Q, \\quad K = XW^K, \\quad V = XW^V $$\n",
    "   其中，$W^Q$, $W^K$, 和 $W^V$ 的形状分别为 $(d, d_k)$。\n",
    "\n",
    "2. **计算注意力分数**：\n",
    "   $$ \\text{Scores} = QK^T / \\sqrt{d_k} $$\n",
    "   这里的 $\\text{Scores}$ 形状为 $(n, n)$，表示每个位置对其他位置的注意力分数。\n",
    "\n",
    "3. **应用softmax**：\n",
    "   $$ \\text{Attention Weights} = \\text{softmax}(\\text{Scores}) $$\n",
    "   这里的 $\\text{Attention Weights}$ 形状也为 $(n, n)$，表示每个位置对其他位置的注意力权重。\n",
    "\n",
    "4. **加权求和**：\n",
    "   $$ \\text{Output} = \\text{Attention Weights} \\cdot V $$\n",
    "   这里的 $\\text{Output}$ 形状为 $(n, d_k)$，表示每个位置的输出向量。\n",
    "\n",
    "### 优点\n",
    "\n",
    "- **并行计算**：自注意力机制可以在并行计算中高效运行，因为每个位置的计算是独立的。\n",
    "- **长距离依赖**：自注意力机制能够有效捕捉长距离依赖关系，而不需要像RNN或LSTM那样逐个处理序列元素。\n",
    "- **灵活的上下文建模**：每个位置可以关注到序列中的任意其他位置，从而捕获更丰富的上下文信息。\n",
    "\n",
    "### 应用\n",
    "\n",
    "自注意力机制在许多NLP任务中表现出色，包括但不限于机器翻译、文本分类、情感分析、命名实体识别等。特别是在Transformer模型中，自注意力机制是其核心组成部分，使得Transformer在各种NLP基准测试中取得了显著的成绩。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<img src=\"self0.png\"/>"
      ],
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Image(url= \"self0.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "https://blog.csdn.net/benzhujie1245com/article/details/117173090"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "input_size=40\n",
    "hidden_size=20\n",
    "query = nn.Linear(input_size, hidden_size)\n",
    "key = nn.Linear(input_size, hidden_size)\n",
    "value = nn.Linear(input_size, hidden_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = torch.randn(30, 40)\n",
    "q = query(x)\n",
    "k = key(x)\n",
    "v = value(x)\n",
    "#x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[-0.2679, -0.2205,  0.2756,  0.1129, -0.1622,  0.1292,  0.0112,  0.0633,\n",
       "          0.2567,  0.1563,  0.0401,  0.0610,  0.1346,  0.1730, -0.1554,  0.1603,\n",
       "          0.0114, -0.2817, -0.0760,  0.1398],\n",
       "        [-0.3397, -0.2865,  0.2437,  0.1693, -0.0989,  0.1774,  0.0426,  0.0056,\n",
       "          0.2165,  0.0444,  0.0655,  0.0495,  0.1462,  0.0825, -0.1607,  0.1153,\n",
       "          0.0105, -0.1826, -0.1456,  0.0346],\n",
       "        [-0.1287, -0.2080,  0.2769,  0.1123, -0.1086,  0.0015,  0.0135,  0.0934,\n",
       "          0.2634,  0.1655, -0.0381,  0.1561,  0.1477,  0.2539, -0.1699,  0.1506,\n",
       "          0.0036, -0.2497, -0.0871,  0.1638],\n",
       "        [-0.1649, -0.2830,  0.2431,  0.1282, -0.0949,  0.1305,  0.0420,  0.0427,\n",
       "          0.2329, -0.0145, -0.0466,  0.0741,  0.0861,  0.1564, -0.1680,  0.1151,\n",
       "          0.0456, -0.1558, -0.1820,  0.0415],\n",
       "        [-0.2099, -0.2515,  0.2563,  0.0168, -0.1187,  0.0099, -0.0300,  0.1171,\n",
       "          0.2640,  0.0848, -0.0839,  0.0782,  0.1152,  0.2258, -0.1635,  0.1898,\n",
       "         -0.0548, -0.2236, -0.1091,  0.0774],\n",
       "        [-0.0994, -0.2918,  0.2089,  0.1916, -0.0727, -0.0611, -0.0479,  0.0599,\n",
       "          0.2557,  0.0449, -0.1268,  0.1638,  0.1376,  0.1574, -0.1289,  0.0475,\n",
       "         -0.0618, -0.1789, -0.0477,  0.0604],\n",
       "        [-0.2212, -0.2692,  0.3132,  0.0456, -0.1057,  0.0926,  0.0107,  0.0894,\n",
       "          0.2622,  0.0051, -0.0487,  0.1174,  0.1549,  0.1817, -0.1957,  0.1868,\n",
       "         -0.0761, -0.2353, -0.1141, -0.0012],\n",
       "        [-0.1419, -0.2061,  0.2652,  0.1658, -0.0845,  0.0624,  0.0556,  0.0715,\n",
       "          0.2555,  0.1324, -0.0270,  0.1180,  0.1062,  0.2424, -0.1471,  0.1452,\n",
       "          0.0459, -0.2032, -0.1045,  0.1441],\n",
       "        [-0.1622, -0.2493,  0.2339,  0.1213, -0.1051,  0.0203,  0.0364,  0.0826,\n",
       "          0.2224,  0.0994, -0.0319,  0.1094,  0.0862,  0.2218, -0.1469,  0.1362,\n",
       "          0.0177, -0.1916, -0.1395,  0.1316],\n",
       "        [-0.2568, -0.2807,  0.2127,  0.1462, -0.0782,  0.1142,  0.0037,  0.0483,\n",
       "          0.2223,  0.0464, -0.0091,  0.0818,  0.0819,  0.1147, -0.1687,  0.1217,\n",
       "          0.0826, -0.1503, -0.1847,  0.0684],\n",
       "        [-0.2077, -0.1774,  0.3306,  0.1870, -0.0850,  0.1194,  0.0431,  0.0658,\n",
       "          0.2802,  0.1997, -0.0227,  0.0915,  0.0970,  0.2051, -0.1795,  0.1482,\n",
       "          0.0977, -0.2578, -0.0934,  0.1591],\n",
       "        [-0.2511, -0.2438,  0.2939,  0.0830, -0.1150, -0.0437, -0.0779,  0.0946,\n",
       "          0.3422,  0.1804, -0.1076,  0.1001,  0.1667,  0.2278, -0.1610,  0.1718,\n",
       "         -0.0830, -0.2746, -0.0308,  0.0550],\n",
       "        [-0.1318, -0.2731,  0.2263,  0.2420, -0.1180,  0.0196, -0.0480,  0.0425,\n",
       "          0.2290,  0.1058, -0.0983,  0.1191,  0.0712,  0.1392, -0.1590,  0.0537,\n",
       "          0.1077, -0.1758, -0.0927,  0.1177],\n",
       "        [-0.1426, -0.1665,  0.3070,  0.1483, -0.0729,  0.0497,  0.0366,  0.1126,\n",
       "          0.2439,  0.1786, -0.0663,  0.1028,  0.0401,  0.2418, -0.1956,  0.1778,\n",
       "          0.1517, -0.2081, -0.1432,  0.1877],\n",
       "        [-0.2755, -0.1562,  0.3172,  0.0518, -0.0986,  0.0578,  0.0775,  0.1157,\n",
       "          0.2513,  0.2158,  0.0451,  0.0778,  0.1316,  0.2536, -0.1940,  0.2520,\n",
       "         -0.0810, -0.2607, -0.0911,  0.1638],\n",
       "        [-0.2923, -0.2981,  0.2712,  0.1471, -0.1414,  0.1291, -0.0668, -0.0033,\n",
       "          0.3067,  0.0774, -0.0450,  0.0956,  0.1677,  0.1067, -0.1725,  0.1132,\n",
       "          0.0193, -0.2329, -0.1011,  0.0178],\n",
       "        [-0.1917, -0.2829,  0.2445,  0.1355, -0.0934,  0.0652, -0.0184,  0.0607,\n",
       "          0.2733,  0.0360, -0.1135,  0.1216,  0.0752,  0.1490, -0.1316,  0.1257,\n",
       "         -0.0192, -0.1724, -0.1225,  0.0176],\n",
       "        [-0.3185, -0.2353,  0.2593,  0.0846, -0.0528,  0.1629,  0.0171,  0.0334,\n",
       "          0.2595,  0.0690, -0.0116,  0.0410,  0.1040,  0.1444, -0.1688,  0.1748,\n",
       "          0.0490, -0.1580, -0.1909,  0.0138],\n",
       "        [-0.2145, -0.2423,  0.2743, -0.0130, -0.1171,  0.0298, -0.0117,  0.1207,\n",
       "          0.2630,  0.1008, -0.0472,  0.0957,  0.1473,  0.2221, -0.1918,  0.1858,\n",
       "         -0.0609, -0.2610, -0.1381,  0.0937],\n",
       "        [-0.2333, -0.2090,  0.2643,  0.1327, -0.0900,  0.1184,  0.0830,  0.0728,\n",
       "          0.2202,  0.1188,  0.0369,  0.0669,  0.0698,  0.1996, -0.1512,  0.1771,\n",
       "          0.0405, -0.2039, -0.1409,  0.1372],\n",
       "        [-0.2457, -0.2139,  0.2374,  0.0511, -0.1146,  0.0658,  0.0356,  0.0833,\n",
       "          0.2217,  0.1345,  0.0087,  0.0704,  0.0864,  0.2026, -0.1706,  0.1640,\n",
       "          0.0029, -0.2038, -0.1556,  0.1460],\n",
       "        [-0.2986, -0.2570,  0.2671,  0.1677, -0.0680,  0.2378,  0.0463,  0.0190,\n",
       "          0.2385,  0.0173,  0.0334,  0.0374,  0.1005,  0.0777, -0.1919,  0.1380,\n",
       "          0.1180, -0.1575, -0.2048,  0.0078],\n",
       "        [-0.2897, -0.2695,  0.2572,  0.0897, -0.1197,  0.1173, -0.1472,  0.0362,\n",
       "          0.3213,  0.0824, -0.0793,  0.0649,  0.1834,  0.0649, -0.1906,  0.1322,\n",
       "          0.0141, -0.2627, -0.0544,  0.0254],\n",
       "        [-0.1788, -0.0779,  0.2430,  0.1010, -0.0241,  0.0449,  0.1942,  0.1179,\n",
       "          0.1329,  0.2579,  0.0794,  0.0437, -0.0458,  0.2960, -0.1588,  0.1812,\n",
       "          0.1085, -0.1540, -0.2046,  0.3006],\n",
       "        [-0.1075, -0.2478,  0.2374,  0.2426, -0.1021, -0.0240, -0.0225,  0.0581,\n",
       "          0.2378,  0.1294, -0.0708,  0.1662,  0.1014,  0.1710, -0.1541,  0.0874,\n",
       "          0.0509, -0.1974, -0.0458,  0.1529],\n",
       "        [-0.0647, -0.2475,  0.2629,  0.1738, -0.1341, -0.0326, -0.0054,  0.1007,\n",
       "          0.2211,  0.1172, -0.0928,  0.1581,  0.0951,  0.1773, -0.1810,  0.0665,\n",
       "          0.0013, -0.2447, -0.0771,  0.1483],\n",
       "        [-0.2195, -0.2651,  0.2063, -0.0234, -0.1253,  0.0385,  0.0099,  0.0873,\n",
       "          0.2721,  0.0697, -0.0123,  0.1138,  0.1892,  0.2394, -0.1723,  0.1720,\n",
       "         -0.1702, -0.2116, -0.1055,  0.1214],\n",
       "        [-0.2445, -0.2014,  0.3096,  0.0517, -0.1206,  0.0623,  0.0646,  0.1139,\n",
       "          0.2311,  0.1485,  0.0327,  0.1018,  0.1206,  0.2256, -0.1933,  0.2226,\n",
       "         -0.0413, -0.2622, -0.1218,  0.1248],\n",
       "        [-0.1476, -0.2724,  0.2069,  0.1222, -0.0534,  0.0073,  0.0124,  0.0551,\n",
       "          0.2264,  0.0527, -0.0633,  0.1282,  0.1176,  0.2030, -0.1580,  0.1131,\n",
       "         -0.0561, -0.1459, -0.1133,  0.1015],\n",
       "        [-0.2514, -0.2996,  0.2219,  0.1457, -0.1331,  0.1515,  0.0300,  0.0170,\n",
       "          0.2391,  0.0092,  0.0386,  0.1031,  0.1554,  0.1247, -0.1601,  0.1149,\n",
       "         -0.0271, -0.1880, -0.1215,  0.0608]], grad_fn=<MmBackward0>)"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "out=torch.mm(q, k.transpose(0, 1))/math.sqrt(20)\n",
    "out=torch.softmax(out, dim=-1)\n",
    "out=torch.mm(out, v)\n",
    "out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = torch.randn(20, 40)\n",
    "q = query(x)\n",
    "k = key(x)\n",
    "v = value(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "attn_weights = torch.mm(q, k.transpose(0, 1))\n",
    "attn_weights = F.softmax(attn_weights, dim=-1)\n",
    "attn_output = torch.mm(attn_weights, v)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "class SelfAttention(nn.Module):\n",
    "    def __init__(self, input_size, hidden_size):\n",
    "        super(SelfAttention, self).__init__()\n",
    "        self.query = nn.Linear(input_size, hidden_size)\n",
    "        self.key = nn.Linear(input_size, hidden_size)\n",
    "        self.value = nn.Linear(input_size, hidden_size)\n",
    "\n",
    "    def forward(self, x):\n",
    "        # 计算Q、K、V\n",
    "        q = self.query(x)\n",
    "        k = self.key(x)\n",
    "        v = self.value(x)\n",
    "        # 计算自注意力矩阵\n",
    "        attn_weights = torch.mm(q, k.transpose(0, 1))\n",
    "        attn_weights = F.softmax(attn_weights, dim=-1)\n",
    "        # 使用自注意力矩阵对V进行加权平均\n",
    "        attn_output = torch.mm(attn_weights, v)\n",
    "        return attn_output"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([30, 20])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "input_size=40\n",
    "hidden_size=20\n",
    "model = SelfAttention(input_size, hidden_size)\n",
    "x = torch.randn(30, 40)\n",
    "out = model(x)\n",
    "out.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多头自注意力机制\n",
    "\n",
    "https://blog.csdn.net/benzhujie1245com/article/details/117173090\n",
    "\n",
    "多头注意力（Multi-Head Attention）机制是注意力机制的一个重要变体，它通过并行使用多个注意力头（attention heads）来捕捉输入序列中的不同信息。这种机制允许模型在不同的表示子空间中同时关注输入的不同方面，从而提高了模型的表达能力和灵活性。多头注意力最著名的应用是在Transformer模型中，该模型由Vaswani等人在2017年的论文《Attention is All You Need》中提出。\n",
    "\n",
    "### 多头注意力的思想\n",
    "\n",
    "多头注意力的基本思想是，通过将输入向量映射到多个不同的低维空间（即多个“头”），每个头可以专注于输入的不同方面或特征。然后，将这些头的输出组合起来，形成更丰富的表示。这种方式类似于人脑在处理信息时，能够同时关注多个特征的能力。\n",
    "\n",
    "### 多头注意力的工作原理\n",
    "\n",
    "1. **线性变换**：首先，输入向量通过线性变换映射到多个低维空间。具体来说，对于每个头，都有独立的权重矩阵 $W^Q_i$, $W^K_i$, 和 $W^V_i$ 分别用于查询（Query）、键（Key）和值（Value）的线性变换。假设我们有 $h$ 个头，那么对于每个头 $i$，我们可以得到：\n",
    "   $$ \\mathbf{Q}_i = X W^Q_i, \\quad \\mathbf{K}_i = X W^K_i, \\quad \\mathbf{V}_i = X W^V_i $$\n",
    "   其中，$X$ 是输入向量矩阵，$W^Q_i$, $W^K_i$, 和 $W^V_i$ 是第 $i$ 个头的权重矩阵。\n",
    "\n",
    "2. **计算注意力分数**：对于每个头，使用标准的注意力机制计算注意力分数。通常使用缩放点积注意力（Scaled Dot-Product Attention）：\n",
    "   $$ \\text{Attention}(\\mathbf{Q}_i, \\mathbf{K}_i, \\mathbf{V}_i) = \\text{softmax}\\left(\\frac{\\mathbf{Q}_i \\mathbf{K}_i^T}{\\sqrt{d_k}}\\right) \\mathbf{V}_i $$\n",
    "   其中，$d_k$ 是键向量的维度，用于缩放点积以防止梯度消失或爆炸。\n",
    "\n",
    "3. **拼接头的输出**：将所有头的输出拼接在一起，形成一个更大的向量：\n",
    "   $$ \\text{Concat}(\\text{head}_1, \\text{head}_2, \\ldots, \\text{head}_h) $$\n",
    "   其中，$\\text{head}_i = \\text{Attention}(\\mathbf{Q}_i, \\mathbf{K}_i, \\mathbf{V}_i)$。\n",
    "\n",
    "4. **最终线性变换**：为了将拼接后的向量映射回原始维度，通常会再进行一次线性变换：\n",
    "   $$ \\text{MultiHead}(Q, K, V) = \\text{Concat}(\\text{head}_1, \\text{head}_2, \\ldots, \\text{head}_h) W^O $$\n",
    "   其中，$W^O$ 是最终的线性变换矩阵。\n",
    "\n",
    "### 优点\n",
    "\n",
    "- **捕捉多种信息**：多头注意力机制可以通过不同的头捕捉输入序列中的不同信息，从而提高模型的表达能力。\n",
    "- **并行计算**：由于每个头的计算是独立的，可以并行执行，提高了计算效率。\n",
    "- **灵活性**：每个头可以学习不同的表示子空间，使得模型能够更好地适应复杂的任务。\n",
    "\n",
    "### 应用\n",
    "\n",
    "多头注意力机制在许多自然语言处理任务中取得了显著的效果，包括但不限于机器翻译、文本分类、情感分析等。它也是Transformer模型的核心组成部分，该模型在各种NLP基准测试中表现出色。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<img src=\"https://i-blog.csdnimg.cn/blog_migrate/d4af5c34f2e6bc4436e739e112767fc6.png\"/>"
      ],
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Image(url= \"https://i-blog.csdnimg.cn/blog_migrate/d4af5c34f2e6bc4436e739e112767fc6.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<img src=\"https://i-blog.csdnimg.cn/blog_migrate/812411cda1aa0f9206469428b743e1c2.png\"/>"
      ],
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Image(url= \"https://i-blog.csdnimg.cn/blog_migrate/812411cda1aa0f9206469428b743e1c2.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "def attention(query, key, value, mask=None, dropout=None):\n",
    "    d_k = query.size(-1)\n",
    "    scores = torch.matmul(query, key.transpose(-2, -1)) / math.sqrt(d_k)\n",
    "    print(\"scores\",scores.size())\n",
    "    if mask is not None:\n",
    "        scores = scores.masked_fill(mask == 0, -1e9)\n",
    "    p_attn = F.softmax(scores, dim = -1)\n",
    "\n",
    "    if dropout is not None:\n",
    "        p_attn = dropout(p_attn)\n",
    "    \n",
    "    return torch.matmul(p_attn, value), p_attn\n",
    "\n",
    "# 深层拷贝\n",
    "def clones(module, N):\n",
    "    return nn.ModuleList([copy.deepcopy(module) for _ in range(N)])\n",
    "\n",
    "class MultiHeadedAttention(nn.Module):\n",
    "    def __init__(self, head, embedding_dim, dropout=0.1):\n",
    "        # head:代表几个头\n",
    "        # embedding_dim:词嵌入维度\n",
    "        # dropout:置0比率\n",
    "        super(MultiHeadedAttention, self).__init__()\n",
    "\n",
    "        # 确认embedding_dim能够被head整除\n",
    "        assert embedding_dim % head == 0\n",
    "        self.head = head\n",
    "        self.d_k = embedding_dim // head\n",
    "        # 获得4个线性层， 分别是Q、K、V、以及最终的输出的线形层\n",
    "        self.linears = clones(nn.Linear(embedding_dim, embedding_dim), 4)\n",
    "        self.attn = None\n",
    "        self.dropout = nn.Dropout(p=dropout)\n",
    "\n",
    "    def forward(self, query, key, value, mask=None):\n",
    "        if mask is not None:\n",
    "            mask = mask.unsqueeze(0)\n",
    "        \n",
    "        batch_size = query.size(0)\n",
    "        print(query.size())\n",
    "\n",
    "        # 经过线性层投影后分成head个注意力头\n",
    "        query, key, value = [model(x).view(batch_size, -1, self.head, self.d_k).transpose(1, 2) for model, x in zip(self.linears, (query, key, value))]\n",
    "        # 各自计算每个头的注意力\n",
    "        print(\"query-hou\",query.size())\n",
    "        \n",
    "        x, self.attn = attention(query, key, value, mask=mask, dropout=self.dropout)\n",
    "        # 转换回来\n",
    "        print(\"x-qian\",x.size())\n",
    "        x = x.transpose(1, 2).contiguous().view(batch_size, -1, self.head * self.d_k)\n",
    "        print(\"x-hou\",x.size())\n",
    "        # 经过最后一个线性层得到最终多头注意力机制的结果\n",
    "        return self.linears[-1](x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(1, 6), (2, 7), (3, 8)]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(zip([1,2,3,4],[6,7,8]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([2, 4, 512])\n"
     ]
    }
   ],
   "source": [
    "d_model = 512  # embedding_size\n",
    "vocab = 1000  # 词典大小\n",
    "x=torch.tensor([[100, 2, 421, 508], [491, 998, 1, 221]], dtype=torch.long)\n",
    "emb = Embeddings(d_model, vocab)\n",
    "embr = emb(x)\n",
    "print(embr.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([2, 4, 512])\n"
     ]
    }
   ],
   "source": [
    "dropout = 0.1\n",
    "max_len = 60\n",
    "pe = PositionalEncoding(d_model, dropout, max_len)\n",
    "pe_result = pe(embr)\n",
    "print(pe_result.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "512"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "8*64"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([2, 4, 512])\n",
      "query-hou torch.Size([2, 8, 4, 64])\n",
      "scores torch.Size([2, 8, 4, 4])\n",
      "x-qian torch.Size([2, 8, 4, 64])\n",
      "x-hou torch.Size([2, 4, 512])\n",
      "tensor([[[ -3.1943,  -4.0948,   0.9919,  ...,   2.6264,   1.8804,  -1.6028],\n",
      "         [ -6.3764,  -4.1197,  -1.5219,  ...,  -1.4719,   6.4804,  -6.0069],\n",
      "         [ -4.0881,  -1.4219,   0.8747,  ...,   1.0582,   4.8356,  -2.7968],\n",
      "         [ -6.1818,  -2.3725,  -0.0891,  ...,   1.6376,   7.5973,  -2.0800]],\n",
      "\n",
      "        [[ -3.9450,  -9.1723,   2.0190,  ...,  -3.5826,  -6.9150,   0.4424],\n",
      "         [ -4.6037, -12.1414,   1.7822,  ...,  -2.4616,  -7.8320,   3.9605],\n",
      "         [ -2.9337, -10.4589,   2.3938,  ...,  -1.3707,  -6.5807,   3.7163],\n",
      "         [ -4.7333, -11.4768,   1.1390,  ...,  -1.2973,  -5.3891,   3.7132]]],\n",
      "       grad_fn=<ViewBackward0>)\n",
      "torch.Size([2, 4, 512])\n"
     ]
    }
   ],
   "source": [
    "head = 8\n",
    "embedding_dim = 512\n",
    "query = key = value = pe_result\n",
    "mask = torch.zeros(8, 4, 4)\n",
    "mha = MultiHeadedAttention(head, embedding_dim, dropout)\n",
    "mha_result = mha(query, key, value, mask)\n",
    "print(mha_result)\n",
    "print(mha_result.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "query = key = value = pe_result\n",
    "mask = Variable(torch.zeros(2, 4, 4))\n",
    "attn, p_attn = attention(query, key, value,mask=mask)\n",
    "# print(attn)\n",
    "# print(attn.shape)\n",
    "# print(p_attn)\n",
    "# print(p_attn.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "torch24",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.19"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
